#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 5

// //栈的顺序存储
typedef struct
{
    int data[MAXSIZE];
    int top;
} STACK;

//初始化栈
void InitStack(STACK *S)
{
    S->top = -1;
}

//判断栈是否为空
bool StackEmpty(STACK *S)
{
    if (S->top == -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//判断栈是否满
bool StackFull(STACK *S)
{
    if (S->top == MAXSIZE - 1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

//入栈
bool Push(STACK *S, int x)
{
    if (StackFull(S))
    {
        printf("栈已满，无法入栈\n");
        return false;
    }
    else
    {
        S->top++;
        S->data[S->top] = x;
        return true;
    }
}

//出栈
bool Pop(STACK *S, int *x)
{
    if (StackEmpty(S))
    {
        printf("栈为空，无法出栈\n");
        return false;
    }
    else
    {
        *x = S->data[S->top];
        S->top--;
        return true;
    }
}

//查看栈顶元素
bool GetTop(STACK *S, int *x)
{
    if (StackEmpty(S))
    {
        printf("栈为空，无法查看栈顶元素\n");
        return false;
    }
    else
    {
        *x = S->data[S->top];
        return true;
    }
}

//遍历
void Traverse(STACK *S)
{
    int i;
    if (StackEmpty(S))
    {
        printf("栈为空，无法遍历\n");
    }
    else
    {
        for (i = S->top; i >= 0; i--)
        {
            printf("%d ", S->data[i]);
        }
        printf("\n");
    }
}

int main()
{
    int e;
    STACK s;
    InitStack(&s);
    Push(&s, 15);
    Push(&s, 20);
    Traverse(&s);
    printf("\n");
    Pop(&s, &e);
    printf("出栈元素%d\n", e);
    Traverse(&s);
}

// typedef struct stack
// {
//     int *top;       /* 栈顶指针 */
//     int *bottom;    /* 栈底指针 */
//     int stack_size; /* 栈的最大容量 */
// } STACK, *PSTACK;

// //初始化
// STACK init(STACK s)
// {
//     s.bottom = (int *)malloc(sizeof(int) * MAXSIZE);
//     if (s.bottom == NULL)
//     {
//         printf("初始化失败");
//         exit(0);
//     }
//     s.top = s.bottom;
//     s.stack_size = MAXSIZE;
//     return s;
// }

// //入栈
// STACK push(STACK s, int data)
// {
//     if (s.top - s.bottom == s.stack_size)
//     {
//         printf("栈空间已满，无法入栈");
//         return s;
//     }
//     *s.top = data;
//     s.top++;
//     return s;
// }

// //出栈
// STACK pop(STACK s, int *e)
// {

//     if (s.top == s.bottom)
//     {
//         printf("栈空，无法出栈");
//         return s;
//     }
//     s.top--;
//     *e = *s.top;
//     return s;
// }

// //遍历
// void traverse(STACK s)
// {
//     if (s.top - s.bottom == s.stack_size)
//     {
//         printf("栈为空栈，无法遍历\n");
//         return;
//     }
//     while (s.top != s.bottom)
//     {
//         s.top--;
//         printf("%d ", *s.top);
//     }
// }

// /* 判断栈是否为满 */
// int StackFull(STACK s)
// {
//     if (s.top - s.bottom == s.stack_size)
//     {
//         return 0;
//     }
//     else
//     {
//         return 1;
//     }
// }

// /* 判断栈是否为空 */
// int StackEmpty(STACK s)
// {
//     if (s.top == s.bottom)
//     {
//         return 0;
//     }
//     else
//     {
//         return 1;
//     }
// }

// int main()
// {
//     int e;
//     STACK s;
//     s = init(s);
//     s = push(s, 15);
//     s = push(s, 20);
//     traverse(s);
//     printf("\n");
//     s = pop(s, &e);
//     printf("出栈元素%d\n", e);
//     traverse(s);
// }